﻿using GroupThreeMESProject.DTO;
using GroupThreeMESProject.Entity;
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;

namespace GroupThreeMESProject.Service.ProductionPlan
{
    [ApiExplorerSettings(GroupName = "v2")]
    public class ProductionPlanList : ApplicationService
    {
        private readonly ISqlSugarClient _db;
        private string? startDateString;
        private int? days;

        public ProductionPlanList(ISqlSugarClient db)
        {
            _db = db;
        }
        [HttpGet("GetProductionPlanList")]
        public DataTable GetProductionPlanList(string? startDateString, int? days = 3)
        {

            // 默认处理startDateString为null的情况，使用当前日期
            if (string.IsNullOrEmpty(startDateString))
            {
                startDateString = DateTime.Now.ToString("yyyy-MM-dd");
            }
            if(startDateString!= startDateString || days!=3)
            {
                _db.Ado.ExecuteCommand("TRUNCATE TABLE MesproductionPlansecond;");
            }

            DateTime startDate = DateTime.Parse(startDateString); // 将startDateString转为DateTime对象
            List<string> dateRange = new List<string>();
            // 根据days生成日期范围
            for (int i = 0; i < days; i++)
            {
                dateRange.Add(startDate.AddDays(i).ToString("yyyy-MM-dd"));
            }
            // 动态生成列名
            List<string> selectColumns = new List<string> { "ProcurementName" };
            List<string> parameterNames = new List<string>();  // 存储每个日期的参数名
            for (int i = 0; i < dateRange.Count; i++)
            {
                string planDateParam = $"@PlanDate{i}";
                parameterNames.Add(planDateParam);  // 存储参数名
                selectColumns.Add($"MAX(CASE WHEN PlanDate = {planDateParam} AND Shift = '白班' THEN PlanValue END) AS `{dateRange[i]} 白班`");
                selectColumns.Add($"MAX(CASE WHEN PlanDate = {planDateParam} AND Shift = '夜班' THEN PlanValue END) AS `{dateRange[i]} 夜班`");
            }
            // 构建 SQL 查询
            var sql = $"SELECT {string.Join(", ", selectColumns)} " +
                      "FROM mesproductionplan " +
                      "WHERE ProcurementName IS NOT NULL " +
                      "GROUP BY ProcurementName;";
            // 创建参数字典并加入日期参数
            var parameters = new Dictionary<string, object>();
            for (int i = 0; i < dateRange.Count; i++)
            {
                parameters.Add(parameterNames[i], DateTime.Parse(dateRange[i]));  // 使用 DateTime 对象作为参数
            }
            // 执行查询并获取结果
            var result = _db.Ado.SqlQuery<dynamic>(sql, parameters);
            // 创建 DataTable 并设置动态列名
            DataTable dt = new DataTable();
            dt.Columns.Add("ProcurementName"); // 始终确保 "ProcurementName" 列在第一列
            foreach (var date in dateRange)
            {
                dt.Columns.Add($"{date} 白班");
                dt.Columns.Add($"{date} 夜班");
            }
            // 填充 DataTable 数据
            foreach (var item in result)
            {
                DataRow row = dt.NewRow();
                row["ProcurementName"] = item.ProcurementName;  // 填充ProcurementName字段
                for (int i = 0; i < dateRange.Count; i++)
                {
                    // 动态访问属性
                    var whiteShift = item.GetType().GetProperty($"{dateRange[i]} 白班")?.GetValue(item, null) ?? DBNull.Value;
                    var nightShift = item.GetType().GetProperty($"{dateRange[i]} 夜班")?.GetValue(item, null) ?? DBNull.Value;

                    row[$"{dateRange[i]} 白班"] = whiteShift;  // 填充白班字段
                    row[$"{dateRange[i]} 夜班"] = nightShift;  // 填充夜班字段
                }
                dt.Rows.Add(row);  // 将当前行添加到DataTable中
            }
            var aa= ProcessData(dt);
            var cc =parameters.Values.First().ToString();
            var dd1 = cc.Substring(0, 4);
            var dd2 = cc.Substring(5, 2);
            var dd3 = cc.Substring(8, 2);
            string vv=dd1+"-"+dd2+"-" + dd3;
            if (startDateString != vv && days != 3)
            {
                InsertDataIntoDatabase(aa);
            }
            //InsertDataIntoDatabase(aa);
            var resulttable = GetProductionPlanListsecond();
            return resulttable;  // 返回填充好的DataTable
        }
        public dynamic ProcessData(DataTable dataTable)
        {
            var result = new List<Dictionary<string, object>>();

            // 获取唯一的 procurementName 列表
            var procurementNames = dataTable.AsEnumerable()
                                              .Select(row => row.Field<string>("procurementName"))
                                              .Distinct()
                                              .ToList();

            // 获取所有日期和班次组合（列名），排除 procurementName 列
            var dateShiftColumns = dataTable.Columns.Cast<DataColumn>()
                                           .Where(col => col.ColumnName != "procurementName")
                                           .Select(col => col.ColumnName)
                                           .ToList();

            // 遍历每个 procurementName，构建结果
            foreach (var procurementName in procurementNames)
            {
                var record = new Dictionary<string, object>
        {
            { "procurementName", procurementName }
        };

                foreach (var column in dateShiftColumns)
                {
                    // 获取当前列的值，默认为 null
                    var value = dataTable.AsEnumerable()
                                         .Where(row => row.Field<string>("procurementName") == procurementName)
                                         .Select(row => row.Field<string>(column)) // 访问对应的列
                                         .FirstOrDefault(); // 如果没有找到，返回 null

                    // 如果没有对应的值，则默认为 null
                    record[column] = value ?? null;
                }

                result.Add(record);
            }
            
            return result;
            //InsertDataIntoDatabase(result);
        }

        public void InsertDataIntoDatabase(List<Dictionary<string, object>> data)
        {
            foreach (var record in data)
            {
                string procurementName = record["procurementName"].ToString();

                // 遍历日期和班次，插入数据
                foreach (var kvp in record)
                {
                    if (kvp.Key == "procurementName") continue; // 排除 procurementName

                    // 假设列名格式是 "日期 班次"，比如 "2024-11-17 白班"
                    string[] parts = kvp.Key.Split(' ');
                    if (parts.Length < 2)
                    {
                        // 如果列名无法拆分成日期和班次，跳过
                        continue;
                    }

                    string date = parts[0];
                    string shift = parts[1];
                    string value = kvp.Value?.ToString(); // 获取值，可能为 null

                    // 创建 ProcurementData 实体
                    var procurementData = new MesproductionPlansecond
                    {
                        ProcurementName = procurementName,
                        PlanDate = date,
                        Shift = shift,
                        PlanValue = value
                    };

                    // 使用 SqlSugar 插入数据
                    _db.Insertable(procurementData).ExecuteCommand(); // 执行插入操作
                }
            }
        }



        [HttpGet("GetProductionPlanListsecond")]
        public DataTable GetProductionPlanListsecond()
        {
            // 查询数据库中所有唯一的计划日期
            var dateQuery = "SELECT DISTINCT PlanDate FROM mesproductionplansecond WHERE ProcurementName IS NOT NULL";
            var dateList = _db.Ado.SqlQuery<string>(dateQuery).ToList();

            if (dateList == null || dateList.Count == 0)
            {
                return new DataTable();  // 或者其他默认返回值
            }

            // 过滤掉 null 或空字符串，并确保日期字符串有效
            List<string> dateRange = dateList
                .Where(date => !string.IsNullOrWhiteSpace(date)) // 过滤掉 null、空字符串和空白字符
                .Select(date =>
                {
                    DateTime parsedDate;
                    return DateTime.TryParse(date, out parsedDate) ? parsedDate.ToString("yyyy-MM-dd") : null;
                })
                .Where(date => date != null) // 过滤掉解析失败的日期
                .ToList();

            // 创建动态的列名
            List<string> selectColumns = new List<string> { "ProcurementName" };

            // 根据日期范围生成动态列
            foreach (var date in dateRange)
            {
                // 使用字符串拼接生成动态列
                string planDateParam = $"@PlanDate{date}"; 

                // 添加对应的白班和夜班字段
                selectColumns.Add($"MAX(CASE WHEN DATE(PlanDate) = '{date}' AND Shift = '白班' THEN PlanValue END) AS `{date} 白班`");
                selectColumns.Add($"MAX(CASE WHEN DATE(PlanDate) = '{date}' AND Shift = '夜班' THEN PlanValue END) AS `{date} 夜班`");
            }

            // 构建 SQL 查询
            var sql = $"SELECT {string.Join(",", selectColumns)} " +
                      "FROM mesproductionplansecond " +
                      "WHERE ProcurementName IS NOT NULL " +
                      "GROUP BY ProcurementName;";

            // 创建参数字典并加入日期参数
            var parameters = new Dictionary<string, object>();
            for (int i = 0; i < dateRange.Count; i++)
            {
                parameters.Add($"@PlanDate{dateRange[i]}", DateTime.Parse(dateRange[i]));  // 使用 DateTime 类型参数
            }

            // 调试：查看构建的 SQL 查询和参数
            Console.WriteLine("SQL Query: " + sql);
            Console.WriteLine("Parameters: " + string.Join(", ", parameters.Select(p => $"{p.Key}: {p.Value}")));

            // 执行查询并获取结果
            var result = _db.Ado.SqlQuery<dynamic>(sql, parameters);

            // 调试：查看返回的结果
            Console.WriteLine("Query Result: ");
            foreach (var row in result)
            {
                Console.WriteLine(row.ToString());  // 打印返回的每一行数据
            }

            // 创建 DataTable 并设置动态列名
            DataTable dt = new DataTable();
            dt.Columns.Add("ProcurementName"); // 始终确保 "ProcurementName" 列在第一列
            foreach (var date in dateRange)
            {
                dt.Columns.Add($"{date} 白班");
                dt.Columns.Add($"{date} 夜班");
            }

            // 填充 DataTable 数据
            foreach (var item in result)
            {
                // 将 ExpandoObject 转换为 IDictionary
                var expandoItem = item as IDictionary<string, object>;

                if (expandoItem != null)
                {
                    DataRow row = dt.NewRow();
                    row["ProcurementName"] = expandoItem["ProcurementName"];  // 获取 ProcurementName 字段

                    for (int i = 0; i < dateRange.Count; i++)
                    {
                        // 拼接列名
                        string whiteShiftColumn = $"{dateRange[i]} 白班";
                        string nightShiftColumn = $"{dateRange[i]} 夜班";

                        // 动态访问 ExpandoObject 中的值
                        var whiteShift = expandoItem.ContainsKey(whiteShiftColumn) ? expandoItem[whiteShiftColumn] : DBNull.Value;
                        var nightShift = expandoItem.ContainsKey(nightShiftColumn) ? expandoItem[nightShiftColumn] : DBNull.Value;

                        // 将值填入 DataRow
                        row[whiteShiftColumn] = whiteShift ?? DBNull.Value;
                        row[nightShiftColumn] = nightShift ?? DBNull.Value;
                    }

                    dt.Rows.Add(row);  // 将当前行添加到 DataTable
                }
            }
            return dt;

        }


            // 模拟从数据库或其他数据源加载设备数据
            public List<MesEquipment> GetEquipmentData()
        {
            var list =  _db.Queryable<MesEquipment>().ToList();
            return list;
        }
        // 模拟从数据库或其他数据源加载生产计划数据
        public List<MesProductionPlan> GetProductionPlanData()
        {
            var list = _db.Queryable<MesProductionPlan>().ToList();
            return list;
        }

        



    }
}
